package c_jmx;

import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

/*
 * 3.定义agent层
 */
public class HelloAgent {
	public static void main(String[] args) throws JMException ,Exception{
		//1.使用jconsole本地查看
		//通过工厂类获取MBeanServer，用来做MBean的容器
		MBeanServer server = ManagementFactory.getPlatformMBeanServer();
		//ObjectName中的取名是有一定规范的，格式为：“域名：name=MBean名称”，其中域名和MBean的名称可以任意取。
		//这样定义后，就可以唯一标识我们定义的这个MBean的实现类了。
		ObjectName helloName = new ObjectName("jmxBean:name=hello");
		//将Hello这个类注入到MBeanServer中，注入需要创建一个ObjectName类 
		server.registerMBean(new Hello(), helloName);
		//
//		Thread.sleep(30*60*1000);
		
		/*//2.工具页访问
		//我们访问地址：http://localhost:8082，点击name=hello
		ObjectName adpterName = new ObjectName("HelloAgent:name=htmladpter,port=8082");
		//需要到导入外部jar包jdmk
		HtmlAdaptorServer adapter = new HtmlAdaptorServer();
		//注入mbean server
		server.registerMBean(adapter, adpterName);
		//开始
		adapter.start();*/
		
		 /* 1、在这里创建一个AdaptorServer，这个类将决定MBean的管理界面，这里用最普通的Html型界面。AdaptorServer其实也是一个MBean。 
		   2、我们可以看到这个工具页，其实与我们上一个案例中的Jconsole中的管理界面类似，都可以操作资源中的属性和方法。
		 */
		
		//3.通过客户端程序进行远程访问
		//这个步骤很重要，注册一个端口，绑定url后用于客户端通过rmi方式连接JMXConnectorServer
		LocateRegistry.createRegistry(9999);
		//URL路径的结尾可以随意指定，但如果需要用Jconsole来进行连接，则必须使用jmxrmi
		JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
		//
		JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null,server);
		  System.out.println("begin rmi start");
          jcs.start();
          System.out.println("rmi start");
		
		
	}
}
